package com.cskaoyan.javase.oop2._1extends._10final._3variable._2member;

/**
 * final修饰成员变量,表示成员常量,它仍然是属于对象的
 * 语法:
 * [访问权限修饰符] final 数据类型 变量名;
 * 直接在类体中写上述语法,会报错,说明:
 * 成员常量没有默认初始化,它的取值必须明确的在创建对象过程中给出,使用以下方式:
 *      1.显式赋值
 *      2.构造器赋值
 *      3.构造代码块赋值
 *以上三种方式赋值,必须选择其一,也只能选择其一.
 * 特别注意,当选择使用构造器赋值时,必须要求所有的构造器都能够完成成员常量的赋值
 * 少一个都不行.
 *
 * 思考: 如果需要一个真正意义上的常量,比如PI,G类似这种
 *      那么使用成员常量可以吗?
 *      成员常量是一个真正意义上的常量吗?
 *
 *      不是,成员常量属于对象,不同对象当中的成员常量取值可能不同
 *      所以它不是一个真正意义上的常量
 *
 *      如果需要一个真正意义上的常量,那就需要使用final修饰的静态变量
 *
 *
 * @since 11:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.age);
        // Cannot assign a value to final variable 'age'
        // s.age++;
        s = new Student(28);
        System.out.println(s.age);
    }
}

class Student {
    // Variable 'age' might not have been initialized
    final int age;

    /*{
        age = 29;
    }*/

    public Student(int age) {
        this.age = age;
    }

    public Student() {
        this.age = 18;
    }
}